# @Version        : 1.0
# @Create Time    : 2021/10/18 22:19
# @File           : validator.py
# @IDE            : PyCharm
# @Desc           : pydantic 模型重用验证器

"""
官方文档：https://docs.pydantic.org.cn/latest/concepts/types/
"""

import json
import datetime


def datetime_validator(value: str | datetime.datetime | int | float | dict):
    # 统一声明格式字符串
    datetime_format = "%Y-%m-%d %H:%M:%S"
    mongodb_date_format = "%Y-%m-%dT%H:%M:%S.%fZ"

    # 处理字符串类型
    if isinstance(value, str):
        try:
            # 直接尝试转换验证
            return datetime.datetime.strptime(value, datetime_format).strftime(
                datetime_format
            )
        except ValueError:
            raise  # 直接抛出异常而不是静默跳过

    # 处理datetime对象
    if isinstance(value, datetime.datetime):
        return value.strftime(datetime_format)

    # 处理MongoDB日期格式
    if isinstance(value, dict) and (date_str := value.get("$date")):
        try:
            dt = datetime.datetime.strptime(date_str, mongodb_date_format)
            return dt.strftime(datetime_format)
        except ValueError:
            pass  # 保留原始异常处理逻辑

    # 统一抛出异常
    raise ValueError("无效的日期时间格式，支持类型：str/datetime/mongodb日期字典")


def date_validator(value: str | datetime.date | datetime.datetime | int | float):
    if isinstance(value, str):
        pattern = "%Y-%m-%d"
        try:
            datetime.datetime.strptime(value, pattern)
            return value
        except ValueError:
            pass
    elif isinstance(value, (datetime.date, datetime.datetime)):
        return value.strftime("%Y-%m-%d")
    raise ValueError("无效的日期格式")


def dict_validator(value: str | dict):
    if isinstance(value, str):
        return value
    elif isinstance(value, dict):
        return json.dumps(value)
    raise ValueError("无效的数据或字符串数据")
